﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using bibliotecaWPF.AccesoDatos;

namespace bibliotecaWPF.LogicaNegocio
{
    class ManejaLibros
    {
        //consultar libro
        public static Libro consulta(string cons)//retorna libro
    {
    LibrosEntities db = new LibrosEntities();

    return db.Libro.SingleOrDefault(l=>l.Titulo==cons); 
    }
        public static Ejemplar buscaej(int id)//retorna ejemplar
        {
            LibrosEntities db = new LibrosEntities();

            return db.Ejemplar.SingleOrDefault(e => e.idLibro == id);
        }
        //consultar socio
        public static Socios buscar(string busc)
        {
            LibrosEntities db = new LibrosEntities();
            return db.Socios.SingleOrDefault(s => s.Rut == busc);
        }

        //agregar Libro
        public static void agregarl(string ti, string au, string añ, string c, string cant)
        {
            LibrosEntities db = new LibrosEntities();
            Libro l1 = new Libro();
            Ejemplar ej = new Ejemplar();//objeto de tabla ejemplar


            l1.Titulo = ti;
            l1.Autor = au;
            l1.Año = Convert.ToInt32(añ);
            Categoria cate = db.Categoria.Single(ca => ca.dCategoria == c);
            l1.idCategoria = cate.idCategoria;

            ej.Cantidad = Convert.ToInt32(cant);//se le pasa cantidad
            ej.idLibro = l1.idLibro;//y el id del libro nuevo

            db.Ejemplar.Add(ej);
            db.Libro.Add(l1);
            db.SaveChanges();
        }
        //agregar nuevo socio
        public static void registrar(string rut,string nom,string ape,string edad,string tel,string sex,string mail)
        {
            LibrosEntities db = new LibrosEntities();
            Socios So = new Socios();

            So.Rut = rut;
            So.Nombre = nom;
            So.Apellido = ape;
            So.Edad = Convert.ToInt32(edad);
            So.Fono = Convert.ToInt32(tel);
            So.Sexo = sex;
            So.Email = mail;

            db.Socios.Add(So);
            db.SaveChanges();
        }


        //eliminar libro-------------------------------------------------------------------------
        public static void eliminarl(string tit)
        {
            LibrosEntities db = new LibrosEntities();

            Libro El = db.Libro.SingleOrDefault(e => e.Titulo == tit);
            Ejemplar EJE = db.Ejemplar.SingleOrDefault(ej => ej.idLibro == El.idLibro);
            //probando borrar multiples registros

            var elprestamo = from p in db.Prestamo
                             where p.idLibro == El.idLibro
                             select p;
            foreach ( Prestamo p in elprestamo)
            {
                db.Prestamo.Remove(p);
            }


            //db.Prestamo.Remove(ep);

            db.Ejemplar.Remove(EJE);
            db.Libro.Remove(El);
            db.SaveChanges();
        }
        //eliminar socio-------------------------------------------------------------------
        public static void eliminarsocio(string rut)
        {
            LibrosEntities db = new LibrosEntities();
            Socios ES = db.Socios.SingleOrDefault(s => s.Rut == rut);
            //aparte de borrar socio debo borrar registros asosiados..prestamo
            var borrar = from pr in db.Prestamo
                             where pr.Rut == ES.Rut
                             select pr;
            foreach (Prestamo pr in borrar)
            {
                db.Prestamo.Remove(pr);
            }

            db.Socios.Remove(ES);
             db.SaveChanges();
        }
        //editar libro----------------------------------------------------------------------------
        public static void editarl(string b, string t, string au,string añ, string cant)
        {
            LibrosEntities db = new LibrosEntities();
            Libro Ml = db.Libro.SingleOrDefault(m => m.Titulo == b);
            Ejemplar Ej = db.Ejemplar.SingleOrDefault(e => e.idLibro == Ml.idLibro);

            Ml.Titulo = t;
            Ml.Autor = au;
            Ml.Año = Convert.ToInt32(añ);
            Ej.Cantidad = Convert.ToInt32(cant);//edita cantidad en ejemplar
            db.SaveChanges();
        }
        //comprobar si existe el libro que se quiere ingresar
        public static bool existe(string titu)
        {
            LibrosEntities db = new LibrosEntities();
            return db.Libro.Any(l => l.Titulo == titu);
        }

        //comprobar si ya existe socio
        public static bool existesocio(string r)
        {
            LibrosEntities db = new LibrosEntities();
            return db.Socios.Any(l => l.Rut == r);
        }
        //ingresar registro de prestamo
        public static void generarp(string rut,int idlib)
        {
            LibrosEntities db = new LibrosEntities();
            Prestamo pres = new Prestamo();
            pres.Rut = rut;
            pres.FechaPrestamo = DateTime.Now;
            pres.Estado = "Debe";
            pres.idLibro = idlib;

            Ejemplar eje = db.Ejemplar.SingleOrDefault(e => e.idLibro == idlib);

            eje.Cantidad--;

            db.Prestamo.Add(pres);
            db.SaveChanges();
        }
        
        //consultar si socio ya posse libro
        public static bool cprestamo(string r)
        { 
            LibrosEntities db=new LibrosEntities();
            return db.Prestamo.Any(p => p.Rut == r & p.Estado == "Debe");
        }
        //libro prestado
        public static bool clibro(int idli)
        {
            LibrosEntities db=new LibrosEntities();
        return db.Prestamo.Any(lp=>lp.idLibro==idli&lp.Estado=="Debe");
        }

        //obtener registro de prestamo
        public static Prestamo obtprestamo(string r)
        {
            LibrosEntities db = new LibrosEntities();
            return db.Prestamo.SingleOrDefault(rp => rp.Rut == r&rp.Estado=="Debe");//agregé del & en adelante...
        }
        
        //editar registro de prestamo
        public static void eprestamo(string r)//busque por rut
        {
            LibrosEntities db = new LibrosEntities();
            Prestamo ep = db.Prestamo.SingleOrDefault(p => p.Rut == r & p.Estado == "Debe");//agregé del & en adelante...
            Ejemplar devEj = db.Ejemplar.SingleOrDefault(e => e.idLibro == ep.idLibro); 

            ep.Estado = "";
            ep.FechaDev = DateTime.Now;
            devEj.Cantidad++;


            db.SaveChanges();
        }
    }
}
